package com.by.toolkit.utils;

import java.util.Objects;
import java.util.function.Supplier;

/**
 * 描述：通过Objects.equals判断的函数式逻辑工具
 *
 * @author liujun
 * @date 2023年06月29 10:20 AM
 */
public class ByIfEqualUtil {

    private ByIfEqualUtil() {

    }

    /**
     * @param o1           o1
     * @param o2           o2
     * @param equalSupplier true时执行
     * @param defaultVal   false时返回
     * @param <T>          泛型
     * @return 返回
     */
    public static <T> T getIfEqual(Object o1, Object o2, Supplier<T> equalSupplier, T defaultVal) {
        if (Objects.equals(o1, o2)) {
            return equalSupplier.get();
        } else {
            return defaultVal;
        }
    }


    /**
     * @param o1            o1
     * @param o2            o2
     * @param equalSupplier  true时执行
     * @param notEqualSupplier false时执行
     * @param <T>           泛型
     * @return 返回
     */
    public static <T> T getIfEqualOrElse(Object o1, Object o2, Supplier<T> equalSupplier, Supplier<T> notEqualSupplier) {
        if (Objects.equals(o1, o2)) {
            return equalSupplier.get();
        } else {
            return notEqualSupplier.get();
        }
    }


    /**
     * @param o1           o1
     * @param o2           o2
     * @param equalRunnable true时执行
     */
    public static void doIfEqual(Object o1, Object o2, ByRunnable equalRunnable) {
        if (Objects.equals(o1, o2)) {
            equalRunnable.run();
        }
    }

    /**
     * @param o1           o1
     * @param o2           o2
     * @param notEqualRunnable 不equal时执行
     */
    public static void doIfNotEqual(Object o1, Object o2, ByRunnable notEqualRunnable) {
        if (!Objects.equals(o1, o2)) {
            notEqualRunnable.run();
        }
    }


    /**
     * @param o1            o1
     * @param o2            o2
     * @param equalRunnable  true执行
     * @param notEqualRunnable false执行
     */
    public static void doIfEqualOrElse(Object o1, Object o2, ByRunnable equalRunnable, ByRunnable notEqualRunnable) {
        if (Objects.equals(o1, o2)) {
            equalRunnable.run();
        } else {
            notEqualRunnable.run();
        }
    }


    /**
     * @param o1            o1
     * @param o2            o2
     * @param equalSupplier  true执行
     * @param notEqualSupplier false执行
     * @param <T>           泛型
     * @return T
     */
    public static <T> T getIfEqualOrElseThrow(Object o1, Object o2, Supplier<T> equalSupplier,
                                             Supplier<? extends RuntimeException> notEqualSupplier) {
        if (Objects.equals(o1, o2)) {
            return equalSupplier.get();
        } else {
            throw notEqualSupplier.get();
        }
    }

    /**
     * @param o1                o1
     * @param o2                o2
     * @param exceptionSupplier 异常supplier
     */
    public static void throwIfNotEqual(Object o1, Object o2, Supplier<? extends RuntimeException> exceptionSupplier) {
        if (!Objects.equals(o1, o2)) {
            throw exceptionSupplier.get();
        }
    }

}
